package com.benshou.bcss.common.quartz.bean;

import org.springframework.core.annotation.AliasFor;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.time.ZoneId;

/**
 * 基于 Spring Bean 的 Quartz 定时任务标记接口：Cron 表达式触发器
 *
 * @author <a href="mailto:liuzhenbang@benshou.com">Liu Zhenbang</a>
 * @see BeanQuartz
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@BeanQuartz(triggerType = BeanQuartz.TriggerType.CRON)
public @interface CronJob {

    /**
     * Cron表达式
     */
    @AliasFor(annotation = BeanQuartz.class, attribute = "cron")
    String cron() default "";

    /**
     * @return 任务分组
     */
    @AliasFor(annotation = BeanQuartz.class, attribute = "group")
    String group() default "BeanQuartz";

    /**
     * @return 任务名（也是唯一标识），默认格式为： {beanName}.{方法名}({参数类型}) ，例如： stateService.statSomething(Long,String)
     */
    @AliasFor(annotation = BeanQuartz.class, attribute = "name")
    String name() default "";

    /**
     * @return 任务描述
     */
    @AliasFor(annotation = BeanQuartz.class, attribute = "description")
    String description() default "";

    /**
     * 任务数据。格式： key1=value1,key2=value2 。会作为参数传入到 JobData 中， Key 与 Value 的类型都为 String ，并覆盖同名参数。
     * 另外，对于带参的 Bean 定时方法，此处设置的传入值的 Key 依次为 param1, param2, param3...， 并且只会按 {@link String} 类型传入。
     */
    @AliasFor(annotation = BeanQuartz.class, attribute = "jobData")
    String jobData() default "";

    /**
     * @return 任务优先级。**注意：值越大，优先级越高。
     */
    @AliasFor(annotation = BeanQuartz.class, attribute = "priority")
    int priority() default 5;

    /**
     * @return 执行延迟（毫秒）。应用启动后，延迟多少毫秒后才会启动任务。当值 > 0 时，才会实际设置延迟，否则直接启动。
     */
    @AliasFor(annotation = BeanQuartz.class, attribute = "startDelay")
    long startDelay() default 0;

    /**
     * @return 任务结束时间戳（毫秒）。一旦超过这个时间，调度不会再触发任务的执行。当值 > 0 时，才会实际设置，否则不限制结束时间。
     */
    @AliasFor(annotation = BeanQuartz.class, attribute = "endTimestamp")
    long endTimestamp() default 0;

    /**
     * @return 时间参数的时区值，默认值为系统默认时区 {@link ZoneId#systemDefault()} 。传入值参考 {@link ZoneId#getId()} 。
     */
    String timezone() default "";

    /**
     * 错过执行的处理策略
     */
    @AliasFor(annotation = BeanQuartz.class, attribute = "misfirePolicy")
    BeanQuartz.MisfirePolicy misfirePolicy() default BeanQuartz.MisfirePolicy.DEFAULT;
}
